var nop_func = new NativeCallback(function (arg) {
    console.log("[NOP THREAD] Thread entry replaced.");
    return 0;
}, 'int', ['pointer']);

var clone = Module.findExportByName('libc.so', 'clone');
Interceptor.attach(clone, {
    onEnter: function (args) {
        var flags = args[2].toInt32();
        if (flags & 0x100000) { // CLONE_VM 或其他你关心的 flag
            var addr_ptr = args[3];
            if (addr_ptr.isNull()) return;

            try {
                var entry = addr_ptr.add(96).readPointer();
                var module = Process.findModuleByAddress(entry);
                if (module && module.name.indexOf("libDexHelper.so") >= 0) {
                    console.log("[PATCH ENTRY]", module.name, entry);
                    addr_ptr.add(96).writePointer(nop_func);
                }
            } catch (e) {
                console.log("[ERROR]", e);
            }
        }
    }
});

function showStacks() {
    Java.perform(function () {
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
    });
}

function hook() {
    Java.perform(function () {
            // var base64 = Java.use("android.util.Base64");
            // base64.encodeToString.overload('[B', 'int').implementation = function (a, b) {
            //     console.log("base64.encodeToString: ", JSON.stringify(a));
            //     var result = this.encodeToString(a, b);
            //     console.log("base64.encodeToString result: ", result)
            //     return result;
            // }

            // let a = Java.use("nk.a");
            // a["e"].implementation = function (str) {
            //     console.log(`a.e is called: str=${str}`);
            //     let result = this["e"](str);
            //     console.log(`a.e result=${result}`);
            //     return result;
            // };


            // let Builder = Java.use("okhttp3.Request$Builder");
            // Builder["addHeader"].implementation = function (str, str2) {
            //     let result = this["addHeader"](str, str2);
            //     if (str == "x-signature") {
            //         console.log(`Builder.addHeader is called: str=${str}, str2=${str2}`);
            //
            //         showStacks()
            //         console.log(`Builder.addHeader result=${result}`);
            //
            //     }
            //     return result;
            // };
            // let u = Java.use("nn0.u");
            // u["x0"].implementation = function (charSequence, strArr, z11, i11, i12, obj) {
            //     console.log(`u.x0 is called: charSequence=${charSequence}, strArr=${strArr}, z11=${z11}, i11=${i11}, i12=${i12}, obj=${obj}`);
            //     let result = this["x0"](charSequence, strArr, z11, i11, i12, obj);
            //     console.log(`u.x0 result=${result}`);
            //     if(result.length == 1){
            //         console.log("stringBuffer.append('0' + str2);")
            //     }
            //     else {
            //         console.log("stringBuffer.append(str2);")
            //     }
            //     return result;
            // };

            // let r = Java.use("com.c.r");
            // r["rs"].implementation = function (str, i11, str2) {
            //     console.log(`r.rs is called: str=${str}, i11=${i11}, str2=${str2}`);
            //     let result = this["rs"](str, i11, str2);
            //     console.log(`r.rs result=${result}`);
            //     return result;
            // };

            // let b = Java.use("nk.b");
            // b["m"].implementation = function () {
            //     console.log(`b.m is called`);
            //     let result = this["m"]();
            //     console.log(`b.m result=${result}`);
            //     return result;
            // };


            // 假设函数的基地址是 0x10000，并且偏移是 0x2844
            var baseAddress = Module.findBaseAddress("librc_tool.so");  // 基地址
            // var offset = 0x2844;  // 偏移
            // var targetAddress = baseAddress.add(offset);  // 目标地址
            //
            // // 挂钩该地址
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         console.log("sub_2844 called at address: " + targetAddress);
            //     },
            //     onLeave: function (retval) {
            //         // 这里可以处理返回值，但如果只关心是否调用，不需要做任何操作
            //     }
            // });


            // 使用 Frida 钩住目标地址
            // var targetAddress = baseAddress.add(0x23D0);  // 目标地址
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         console.log('sub_23D0 called at address: ' + targetAddress);
            //     },
            //     onLeave: function (retval) {
            //     }
            // });

            // var targetAddress = baseAddress.add(0x331C);  // 目标地址
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         // 打印每个传入参数
            //         console.log('sub_331C called at address: ' + targetAddress);
            //
            //         // 打印各个参数
            //         console.log('Parameter 1 (const void *): ', hexdump(args[0]));
            //         console.log('Parameter 2 (int): ' + args[1].toInt32());
            //         console.log('Parameter 3 (void *): ' + hexdump(args[2]));
            //         console.log('Parameter 4 (_DWORD *): ' + hexdump(args[3]));
            //         console.log('Parameter 5 (char *): ' + Memory.readUtf8String(args[4]));
            //         console.log('Parameter 6 (unsigned int): ' + args[5].toUInt32());
            //         console.log('Parameter 7 (char *): ' + Memory.readUtf8String(args[6]));
            //     },
            //     onLeave: function (retval) {
            //         // 打印返回值
            //         console.log('sub_331C returned: ' + retval);
            //     }
            // });


            let r = Java.use("com.c.r");
            r["rs"].implementation = function (str, i11, str2) {
                // str = "2#02101500#1757926852347#/app-bff-api/login##body=%2BW%2FGJnXjg12O%2FdhIOskzTynjjGzOQ8pegHVWTp%2FqZe%2FOUl%2BZjbNuL7lyfKrSqa8yrBbToRu8AbnH%0ADd6ltcNPYopbFeoBKHefbRoOkbo90nBORovi37kH5XjKz6hpuJmdVax290FM4M4iERu61g%2B8FGCr%0ASixZjbIhXBm2M4Q14JODVQH6QWwBOlMV1YYXbmAKxSNlN2UVv%2Fp5YWJHlMZaA8CsStW3OpVMazPW%0A7mf63KuaJOW54P8%2BE79rzjjV7wMvnHHAWPMFTiMfV9SHUSi7g49tthPiP6bzmpkSHE%2BKuecuP7JA%0AHHNmjGu939YADouaav7IomRw%2FdLZJmbCrsqvG3MURNBXmTXa6adI%2Bp5Uj%2BUwQbp6cyta6hSk13Nd%0AZPem6Id6rXx2Euxwxc4E%2BXxhAkFVfc5iUnbbuAVgoHtYwRnTsdUnK42aTqXONKIUyFshBxyYztFN%0AvkcX%2FCOV5fUhF3TUlWPNuTaafUb3VDnFoE00c9Tk%2BtTpbTw4EZXB%2FElnt2zpsR%2FARxAv6sdIUHIY%0A%2Fn4NRBJWKKuLVs%2BeBAjjAW4TICwNJGOfofQJXZ3bJFhA152jrS1o47H3d7eJHRdQwYO%2FE4czotzK%0ADHS93vNKNlP1mCKcv%2FrrRFIGC7Od2Cr2tAeoAFOBXhYJ6vcYKHzkQb6hMccxfbO%2B5YG0yF2zHspU%0AChX2dSBhudhDbPddMpN1f8isruOgn%2F%2BvzcwMaMF0KLbuXoJHdkZcwmKUAKsIwXI%3D%0A"
                // console.log(`r.rs is called: str=${str}, i11=${i11}, str2=${str2}`);
                let result = this["rs"](str, i11, str2);
                // console.log(`r.rs result=${result}`);
                return result;
            };


            // var offset = 0x2168C;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[1]
            //         console.log("a1", hexdump(this.a1))
            //         console.log("a2", this.a2.toInt32())
            //     },
            //     onLeave: function (retval) {
            //         // var buf = Memory.readByteArray(this.a1, 1212);
            //         // console.log("a1 retval", toHex(buf))
            //         console.log("a1 retval", hexdump(this.a1))
            //         console.log("a2 retval", this.a2.toInt32())
            //         console.log("<<<<==================================>>>>>")
            //     }
            // });

            // var offset = 0x1F78C;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a3 = args[2]
            //         // 在函数调用进入时，打印参数
            //         console.log('sub_1F78C called at address: ' + targetAddress);
            //         console.log("a1", hexdump(args[0]))
            //         console.log("a2", args[1].toInt32())
            //         console.log("a3", hexdump(this.a3))
            //         console.log("a4", hexdump(args[3]))
            //     },
            //     onLeave: function (retval) {
            //         console.log("over", hexdump(this.a3))
            //     }
            // });

            // var offset = 0x1F730;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[1]
            //         this.a3 = args[2]
            //         this.a4 = args[3]
            //         console.log("a1", hexdump(this.a1))
            //         console.log("a2", this.a2.toInt32())
            //         console.log("a3", hexdump(this.a3))
            //         console.log("a4", hexdump(this.a4))
            //     },
            //     onLeave: function (retval) {
            //         console.log("retval a3",hexdump(this.a3))
            //         console.log("retval a4",hexdump(this.a4))
            //
            //     }
            // });

            // function toHex(buffer) {
            //     var bytes = new Uint8Array(buffer);
            //     var hex = [];
            //     for (var i = 0; i < bytes.length; i++) {
            //         hex.push(('0' + bytes[i].toString(16)).slice(-2));
            //     }
            //     return hex.join('');
            // }

            // var offset = 0x2B8C;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[1]
            //         this.a3 = args[2]
            //         // console.log("a1", hexdump(this.a1))
            //         // console.log("a2", hexdump(this.a2))
            //         console.log("a3", hexdump(this.a3))
            //     },
            //     onLeave: function (retval) {
            //         // console.log("retval", hexdump(retval))
            //         // console.log("retval", Memory.readUtf8String(retval))
            //     }
            // });


            // var offset = 0x2ADF0;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[1]
            //         this.a3 = args[2]
            //         var buf = Memory.readByteArray(this.a1, 606);
            //         console.log("a1", toHex(buf))
            //         console.log("a2", this.a2.toInt32())
            //         console.log("a3", hexdump(this.a3))
            //     },
            //     onLeave: function (retval) {
            //         // var buf = Memory.readByteArray(this.a1, 606);
            //         // console.log("retval a1", toHex(buf))
            //         // console.log("retval a2", this.a2.toInt32())
            //         // var buf = Memory.readByteArray(this.a3, 606);
            //         // console.log("retval a3", toHex(buf))
            //     }
            // });

            // var offset = 0x1FD28;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         console.log("a1", hexdump(this.a1))
            //     },
            //     onLeave: function (retval) {
            //         console.log("retval", retval.toInt32())
            //     }
            // });


            // var offset = 0x168C4;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[1]
            //         this.a3 = args[2]
            //         this.a4 = args[3]
            //         this.a5 = args[4]
            //         console.log("a1", this.a1)
            //         console.log("a2", Memory.readUtf8String(this.a2))
            //         var buf = Memory.readByteArray(this.a2, 464);
            //         console.log("a2_hex", toHex(buf))
            //         console.log("a3", this.a3.toInt32())
            //         console.log("a4", hexdump(this.a4))
            //         console.log("a5", hexdump(this.a5))
            //     },
            //     onLeave: function (retval) {
            //         console.log("retval a1", this.a1.toInt32())
            //         console.log("retval a2",  Memory.readUtf8String(this.a2))
            //         console.log("retval a3", this.a3.toInt32())
            //         console.log("retval a4", hexdump(this.a4))
            //         console.log("retval a5", hexdump(this.a5))
            //         // var buf = Memory.readByteArray(this.a5, 464);
            //         // console.log("retval a5", toHex(buf))
            //
            //     }
            // });


            // var offset = 0x2AD70;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         console.log("a1", hexdump(this.a1))
            //     },
            //     onLeave: function (retval) {
            //         console.log("retval", retval)
            //         console.log("retval a1", hexdump(this.a1))
            //     }
            // });
            //
            //
            // var offset = 0x2AD70;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[2]
            //         this.a3 = args[3]
            //         this.a4 = args[4]
            //         this.a5 = args[5]
            //         this.a6 = args[6]
            //         this.a7 = args[7]
            //         this.a8 = args[8]
            //         this.a9 = args[9]
            //         console.log("a1", hexdump(this.a1))
            //         console.log("a2", this.a2)
            //         console.log("a3", this.a3)
            //         console.log("a4", this.a3)
            //         console.log("a5",this.a4)
            //         console.log("a6", hexdump(this.a5))
            //         console.log("a7", hexdump(this.a6))
            //         console.log("a8", hexdump(this.a7))
            //         console.log("a9", this.a8)
            //     },
            //     onLeave: function (retval) {
            //         console.log("retval", retval)
            //     }
            // });


            // var offset = 0x4760;  // 偏移量
            // var targetAddress = baseAddress.add(offset);  // 目标函数的地址
            // // 使用 Frida hook 目标函数
            // Interceptor.attach(targetAddress, {
            //     onEnter: function (args) {
            //         this.a1 = args[0]
            //         this.a2 = args[1]
            //         this.a3 = args[2]
            //         this.a4 = args[3]
            //         this.a5 = args[4]
            //         this.a6 = args[5]
            //         this.a7 = args[6]
            //         this.a8 = args[7]
            //         this.a9 = args[8]
            //         this.a10 = args[9]
            //         console.log("a1", hexdump(this.a1))
            //         console.log("a2", this.a2)
            //         console.log("a3", hexdump(this.a3))
            //         console.log("a4", Memory.readS64(this.a4))
            //         console.log("a5", this.a5.toInt32())
            //         console.log("a6", hexdump(this.a6, 1024))
            //         console.log("a7", this.a7.toInt32())
            //         console.log("a8", this.a8.toInt32())
            //         console.log("a9", this.a9.toInt32())
            //         console.log("a10", Memory.readS64(this.a10))
            //     },
            //     onLeave: function (retval) {
            //         console.log("retval", retval)
            //         console.log("retval a1", hexdump(this.a1))
            //         console.log("retval a2", this.a2.toInt32())
            //         console.log("retval a3", hexdump(this.a3))
            //         console.log("retval a4", hexdump(this.a4))
            //         console.log("retval a5", this.a5.toInt32())
            //         console.log("retval a6", hexdump(this.a6))
            //         console.log("retval a7", this.a7.toInt32())
            //         console.log("retval a8", this.a8.toInt32())
            //         console.log("retval a9", this.a9.toInt32())
            //         console.log("retval a10", hexdump(this.a10))
            //
            //     }
            // });


            // hook 私钥
            // Java.perform(function () {
            //     // 切换classLoader
            //     Java.enumerateClassLoaders({
            //         onMatch: function (loader) {
            //             try {
            //                 if (loader.findClass("com.starbucks.cn.baselib.network.security.ApiSignature")) {
            //                     Java.classFactory.loader = loader;
            //                     console.log(loader)
            //                 }
            //             } catch (e) {
            //
            //             }
            //
            //         },
            //         onComplete: function () {
            //
            //         }
            //     })
            //     var ApiSignature = Java.use("com.starbucks.cn.baselib.network.security.ApiSignature");
            //
            //     // hook 方法 a(String, String, String)
            //     ApiSignature.a.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (arg1, arg2, arg3) {
            //         console.log("[*] a() called with arguments:");
            //         console.log("    arg1: " + arg1);
            //         console.log("    arg2: " + arg2);
            //         console.log("    arg3: " + arg3);
            //
            //         // 调用原方法
            //         var result = this.a(arg1, arg2, arg3);
            //
            //         console.log("[*] a() result: " + result);
            //         return result; // 如果需要可以修改返回值
            //     };
            //
            //
            // })


            // var hashMap = Java.use("java.util.HashMap");
            // hashMap.put.implementation = function (a, b) {
            //     // 不行可换 a.equals("username")
            //     if (a == "X-XHPAcPXq-g") {
            //         console.log("hashMap.put: ", a, "-------", b);
            //         // showStacks();
            //     }
            //
            //     return this.put(a, b);
            // }

            let APIGuard = Java.use("com.apiguard3.APIGuard");
            APIGuard["getRequestHeaders"].implementation = function (str, bArr) {
                console.log(`APIGuard.getRequestHeaders is called: str=${str}, bArr=${bArr}`);
                let result = this["getRequestHeaders"](str, bArr);
                showStacks()
                console.log(`APIGuard.getRequestHeaders result=${result}`);
                let HashMap = Java.use("java.util.HashMap");
                let map = Java.cast(result, HashMap).toString();
                console.log(map)
                return result;
            };
            let AGState = Java.use("com.apiguard3.AGState");
            AGState["a"].implementation = function (str, i11, objArr) {
                console.log(`AGState.a is called: str=${str}, i11=${i11}, objArr=${objArr}`);
                this["a"](str, i11, objArr);
            };


        }
    )
}
